﻿/* Node操作相关的JS. add by terry */
// node中的svg.
var vis_n;
// 初始化node.
var nodeInit=function(vis) {
	vis_n = vis;
	// 节点相关操作.
    node = vis.selectAll("g.node")
        .data(defaultConfig.data.nodes)
        .enter().append("svg:g")
        .attr("class", "node")
        .call(nodeDrag)
        .on('mouseover', function(d) {
        	
        	// 先去掉悬浮高亮等操作.
        	return;
            if (node.mouseoutTimeout) {
                clearTimeout(node.mouseoutTimeout);
                node.mouseoutTimeout = null;
            }

            highlightToolTip(d);

        })
        .on('mouseout', function() {
            if (node.mouseoutTimeout) {
                clearTimeout(node.mouseoutTimeout);
                node.mouseoutTimeout = null;
            }
            node.mouseoutTimeout=setTimeout(function() {
                highlightToolTip(null);
            }, 300);
        }) // dblclick
        .on('click',function(d){
            highlightObject(d);
            d3.event.stopPropagation();
        });
        d3.select("body").on('dblclick',function(){
            dependsNode=dependsLinkAndText=[];
            highlightObject(null);
        });

		// 初始化node上的图片.
		nodeImg(node);
		// 初始化node上的文本.
		nodeText(node);
		
		// 返回节点信息.
		return node	;
};


// 设置node.
var setNode=function(id,key,value) {
	// 获取展示节点.
	var node = document.getElementById(id+"_node");
	// 获取节点对应的文本.
	var nodeText = document.getElementById(id+"_text");
	// 获取节点对象json中的部分 .
	var nodeObj = getNodeObj(id);
	
	// 节点设置. *******************
	// 设置颜色.
	if(key == "nodeColor"){
		// 修改json对象.
		nodeObj.nodeColor = value;
		node.setAttribute("fill",value);
		return;
	}
	// 设置半径.
	if(key == "r"){
		// 修改json对象.
		nodeObj.r = value;;
		node.setAttribute("r",value);
		// 修改半径后，相对应的文字坐标也要进行调整，才不会盖住.
		nodeText.setAttribute("dy",nodeTextDy(nodeObj));
		nodeText.setAttribute("dx",nodeTextDx(nodeObj));
		return;
	}
	
	// 文本相关设置. *******************
	// 设置label文字.
	if(key == "label"){
		// 修改json对象.
		nodeObj.label = value;
		nodeText.textContent = value;
		// 重置文本坐标.
		nodeText.setAttribute("dy",nodeTextDy(nodeObj));
		nodeText.setAttribute("dx",nodeTextDx(nodeObj));
		return;
	}
	// 设置字体方向.
	if(key == "labelDirection"){
		// 修改json对象.
		nodeObj.labelDirection = value;
		// 重置文本坐标.
		nodeText.setAttribute("dy",nodeTextDy(nodeObj));
		nodeText.setAttribute("dx",nodeTextDx(nodeObj));
		return;
	}
	// 设置字号.
	if(key == "fontSize"){
		// 修改json对象.
		nodeObj.fontSize = value;
		nodeText.setAttribute("style","pointer-events: none; font: "+value+"px sans-serif;");
		// 重置文本坐标.
		nodeText.setAttribute("dy",nodeTextDy(nodeObj));
		nodeText.setAttribute("dx",nodeTextDx(nodeObj));
		return;
	}
	// 设置字体颜色.
	if(key == "fontColor"){
		// 修改json对象.
		nodeObj.fontColor = value;
		nodeText.setAttribute("fill",value);
		return;
	}
	
};

// 高亮线条对象.
this.highlightObject=function(obj){
    if (obj) {
    	/*************************************   waring 注意 这两个集合非常重要，后期可用于多选的样式设置中************/
    	/*************************************   waring 注意 这两个集合非常重要，后期可用于多选的样式设置中************/
    	/*************************************   waring 注意 这两个集合非常重要，后期可用于多选的样式设置中************/
    	/*************************************   waring 注意 这两个集合非常重要，后期可用于多选的样式设置中************/
    	/*************************************   waring 注意 这两个集合非常重要，后期可用于多选的样式设置中************/
    	/*************************************   waring 注意 这两个集合非常重要，后期可用于多选的样式设置中************/
    	/*************************************   waring 注意 这两个集合非常重要，后期可用于多选的样式设置中************/
    	// 重置操作效果，一次点击，只有一次选中效果。 add by terry 这两个集合非常重要，后期可用于多选的样式设置中。
    	dependsLinkAndText = dependsNode=[];
        var objIndex= obj.index;
        dependsNode=dependsNode.concat([objIndex]);
        dependsLinkAndText=dependsLinkAndText.concat([objIndex]);
        defaultConfig.data.links.forEach(function(lkItem){
            if(objIndex==lkItem['source']['index']){
                dependsNode=dependsNode.concat([lkItem.target.index])
            }else if(objIndex==lkItem['target']['index']){
                dependsNode=dependsNode.concat([lkItem.source.index])
            }
        });
        _this.node.classed('inactive',function(d){
            return (dependsNode.indexOf(d.index)==-1)
        });
        _this.link.classed('inactive', function(d) {

            return ((dependsLinkAndText.indexOf(d.source.index)==-1)&&(dependsLinkAndText.indexOf(d.target.index)==-1))
        });

        _this.linetext.classed('inactive',function(d){
            return ((dependsLinkAndText.indexOf(d.source.index)==-1)&&(dependsLinkAndText.indexOf(d.target.index)==-1))
        });
    } else {
        _this.node.classed('inactive', false);
        _this.link.classed('inactive', false);
        _this.linetext.classed('inactive', false);
    }
};


// 查找最大的节点.
var findMaxWeightNode=function(){
    var baseWeight= 1,baseNode;
    defaultConfig.data.nodes.forEach(function(item){
        console.info(item)
        if(item.weight>baseWeight){
            baseWeight=item.weight
            baseNode=item
        }
    });
    return baseNode;
};
        

// add by terry 节点添加文本.
var nodeText=function(node) {
	// 节点添加文本. ano by terry 修改之前的文本注释掉.
	// 文本位置调整靠下方.
    node.append("svg:text")
            .attr("style", function(d){
            	return "pointer-events: none; font: "+d.fontSize+"px sans-serif;";
            })
            .attr("fill", function(d){
            	// 字体颜色
            	return d.fontColor;
            })
            .attr("class", "nodetext")
            .attr("id",function(d){
            	// 设置id
	        	return d.id + "_text";
	        })
            .attr("dy", function(d){
            	// 设置文本y坐标.
            	return nodeTextDy(d);
            })
            .attr("dx", function(d){
            	// 设置文本x坐标.
            	return nodeTextDx(d);
            })
            .attr('text-anchor','middle')
            .text(function(d) {
				return d["label"]; 
			})
};

// 节点文本y坐标计算.
var nodeTextDy=function(d) {
	// 左侧或右侧.
	if(d.labelDirection == "RIGHT" || d.labelDirection == "LEFT"){
		return parseInt(d.fontSize) / 2;
	}
	if(d.labelDirection == "TOP"){
		return -(parseInt(d.r) + parseInt(d.fontSize) / 2);
	}
	if(d.labelDirection != "BOTTOM"){
		return 0;
	}
	// 字体间隔距离
	return parseInt(d.r) + 8 + parseInt(d.fontSize) / 2;
};

// 节点文本x坐标计算.
var nodeTextDx=function(d) {
	// 左侧.
	if(d.labelDirection == "LEFT"){
		return -(parseInt(d.r) + calcStringPixelsCount(d.label,parseInt(d.fontSize)) / 2);
	}
	if(d.labelDirection != "RIGHT"){
		return 0;
	}
	// 字体横向距离设置
	return parseInt(d.r) + calcStringPixelsCount(d.label,parseInt(d.fontSize)) / 2;
};

// add by terry 节点添加图像.
var nodeImg=function(node) {
	// 节点添加图像.
    //alert(this.node.key);
    // ano by terry 由图像，换为圆形填充.
//  node.append("svg:image")
//      .attr("class", "circle")
//      .attr("xlink:href", function(d){
//		    if(d["类型"] == "人"){
//			return "images/person.png"; 
//			}else if(d["类型"] == "公司"){
//			return "images/company.png"; 
//			}
//		})
//      .attr("x", "-15px")
//      .attr("y", "-15px")
//      .attr("width", "30px")
//      .attr("height", "30px");

    node.append("svg:circle")
        .attr("class", "circle")
        .attr("cx", function(d){
        	if(d.x && false){
        		// 设置默认x，之前默认为0
        		return d.x;
        	}
        	return "0";
        })
        .attr("cy",  function(d){
        	if(d.y && false){
        		// 设置默认y，之前默认为0
        		return d.y;
        	}
        	return "0";
        })
        .attr("id",function(d){
        	return d.id + "_node";
        })
        .attr("r", function(d){
        	// 设置节点半径.
        	return d.r;
        })
        .attr("fill", function(d){
        	// 设置节点颜色.
        	return d.nodeColor;
        });
};
